import 'dart:async';
import 'package:flutter_plugin_record_plus/const/response.dart';
import 'package:flutter_plugin_record_plus/index.dart';

typedef ResponseListener = void Function(RecordResponse recordResponse);

/// `SoundRecorder`，是一个用于录音的工具类，用于在 Flutter 应用程序中进行录音操作。
///
/// 该类具有以下功能和作用：
///
/// 1. 创建单例对象：通过工厂构造函数创建一个单例对象，确保在应用程序中只有一个 `SoundRecorder` 实例。
/// 2. 初始化录音插件：在私有构造函数中，初始化录音插件 `FlutterPluginRecord`，并调用 `initRecorder` 方法进行录音插件的初始化操作。
/// 3. 录音状态监听：通过 `responseListener` 方法，接收并监听录音状态的变化。当录音状态发生变化时，将通过回调函数 `listener` 返回 `RecordResponse` 对象，可以根据具体的录音状态进行相应的处理。
/// 4. 录制过程监听：通过 `responseFromAmplitudeListener` 方法，监听录音过程中录制声音的大小变化。当录制声音的大小发生变化时，将通过回调函数 `listener` 返回 `RecordResponse` 对象，可以根据录制声音的大小进行相应的处理，例如实现语音动画效果。
/// 5. 开始录音：通过 `startRecord` 方法启动录音操作。
/// 6. 停止录音：通过 `stopRecord` 方法停止录音操作。
/// 7. 释放资源：通过 `dispose` 方法释放录音插件的资源，在不需要录音功能时可以调用该方法进行资源释放，以避免资源泄漏。
class SoundRecorder {
  // 单例
  static final SoundRecorder _instance = SoundRecorder._internal();

  // 录音插件
  late FlutterPluginRecord _recorder;

  // 是否已经初始化
  bool isInited = false;

  // 工厂构造函数
  factory SoundRecorder() {
    return _instance;
  }

  // 私有构造函数
  SoundRecorder._internal() {
    _recorder = FlutterPluginRecord();
    initRecorder();
  }

  // 初始化录音
  void initRecorder() {
    if (!isInited) {
      _recorder.init();
      isInited = true;
    }
  }

  // 释放资源
  void dispose() {
    _recorder.dispose();
  }

  /// 监听录音状态
  /// msg: onStop，onStart
  StreamSubscription<RecordResponse> responseListener(
          ResponseListener listener) =>
      _recorder.response.listen(listener);

  // 录制过程监听录制的声音的大小 方便做语音动画显示图片的样式
  StreamSubscription<RecordResponse> responseFromAmplitudeListener(
          ResponseListener listener) =>
      _recorder.responseFromAmplitude.listen(listener);

  // 开始录音
  void startRecord() {
    _recorder.start();
  }

  // 停止录音
  void stopRecord() {
    _recorder.stop();
  }
}
